﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.IO;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Datos.SqlServer;
using AjaxControlToolkit;

namespace Sistema_Totem.Vista.ERS
{
    public partial class ModificarErsSeccionesDisponibles : System.Web.UI.Page
    {
        private List<String> RetrievedSecciones;
        private List<String> RetrievedElementos;
        private List<String> NombreContenidos;
        private List<String> NombreElementos;
        private String postdata = "../../index.aspx";
        private List<Elemento> datos = new List<Elemento>();
        private SqlServerErs sqlers;
        private int auxj;
        private AccordionPane aux;
        private int IdErs = 0;
        private String NombreProyecto = "ProyectoPrueba";
        private PdfErs GeneraPDF;

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                //if (Session["tipo_usuario"].ToString() != "Gerente de Proyecto" && Session["tipo_usuario"].ToString() != "Analista")
                //{
                //    Response.Redirect("~/Vista/Login/Login1.aspx");
                //}
                //Proyecto proy = (Proyecto)Session["objProyecto"];
                ////NombreProyecto= /*Recibe el nombre de proyecto*/
                //if (proy.Nombre.ToString() != null)
                //{
                //    NombreProyecto = proy.Nombre.ToString();
                //}
            }
            catch (NullReferenceException)
            {
                //Response.Redirect("~/Vista/Login/Login1.aspx");
            }
            

            GeneraPDF = new PdfErs();
            sqlers = new SqlServerErs();
            RetrievedSecciones = new List<String>();
            RetrievedElementos = new List<String>();
            NombreContenidos = new List<String>();
            IdErs = 0;
            RecibirData(NombreProyecto);

            BotonCancelar2.Attributes.Add("onclick", "return confirm('¿Seguro que desea cancelar?');");
            BotonGuardar.Attributes.Add("onclick", "return confirm('¿Seguro que desea guardar los cambios realizados?');");
            BotonGenerarErs.Attributes.Add("onclick", "return confirm('¿Seguro que desea generara el documento ERS?, al aceptar se guardara toda la información escrita hasta este momento');");
        }

        /// <summary>
        /// LLena cada Accordionpane con el titulo de cada elemento y el componente correspondiente
        /// siempre dependiendo de la cantidad de elementos que reciba
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyeco</param>
        /// <param name="NombreSeccion">Contiene el nombre del la seccion</param>
        /// <param name="ListaElementos">Contiene la lista de elementos de la seccion que recibe</param>
        /// <param name="ListaContenidos">Contiene la lista de contenidos de cada elemento</param>
        protected void LlenaAcordionPane(String NombreProyecto, String NombreSeccion, List<String> ListaElementos, List<String> ListaContenidos)
        {
            if (ListaElementos.Count > 0)
            {
                aux = new AccordionPane();
                aux.HeaderContainer.Controls.Add(new LiteralControl(NombreSeccion));
                aux.HeaderContainer.ID = NombreSeccion;
                aux.ID = "AcordionPane" + auxj;
                for (int i = 0; i < ListaElementos.Count; i++)
                {
                    String resultado = RecibirElementoCompTipoDat(NombreProyecto, NombreSeccion, ListaElementos[i]);
                    string[] elem = resultado.Split('@');
                    aux.ContentContainer.Controls.Add(new LiteralControl(elem[0]));
                    RetrievedElementos.Add(elem[0]);
                    aux.ContentContainer.ID = elem[0] + auxj;
                    define_componente(ListaContenidos, NombreSeccion, elem[0], elem[1], auxj, elem[2]);
                    auxj++;
                }
                AccordionCtrl.Panes.Add(aux);
            }
        }

        /// <summary>
        /// Define el componente que se va agregar en el accordionpane, y le asigna
        /// la informacion previa que tenia cada elemento en base de datos si es
        /// el caso
        /// </summary>
        /// <param name="contenidos">Almacena la lista de contenidos</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        /// <param name="NombreElemento">Contiene el nombre del elemento</param>
        /// <param name="TipoElemento">Contiene el tipo del elemento</param>
        /// <param name="i">Contado de tipo entero</param>
        /// <param name="TipoDato">Contiene el tipo de dato del elemento</param>
        protected void define_componente(List<String> contenidos, String NombreSeccion, String NombreElemento, String TipoElemento, int i, String TipoDato)
        {
            if (TipoElemento.Equals("TextBox") | TipoElemento.Equals("textarea"))
            {
                TextBox texto = new TextBox();
                texto.Width = 635;
                texto.Height = 70;
                texto.ID = "TextBox" + i;
                texto.Rows = 6;
                texto.Columns = 70;

                for (int j = 0; j < contenidos.Count; j++)
                {
                    string[] cont = contenidos[j].Split('@');
                    if (cont[1].Equals(NombreElemento) && cont[2].Equals(NombreSeccion))
                    {
                        texto.Text = cont[0];
                    }
                }
                aux.ContentContainer.Controls.Add(texto);
            }

        }

        /// <summary>
        /// Invoca a una funcion que trae los contenidos de los elementos de un proyecto
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <returns>Retorna una lista de String con los contenidos y los elementos</returns>
        protected List<String> RecibeContenido(String NombreProyecto)
        {
            return sqlers.SelectContenidoElemento(NombreProyecto);
        }

        /// <summary>
        /// Recibe la data enviada por post en la pantalla anterior, en esta 
        /// se incluyen los elementos y la seccion a la que pertenece
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        protected void RecibirData(String nompr)
        {
            int j = 0;
            List<String> ListaElementos;
            while (Request.QueryString["SECCION" + j] != null)
            {
                int i = 0;
                ListaElementos = new List<String>();
                String NombreSeccion = null;
                if (Request.QueryString["ELEMENTO" + j + "" + i] != null)
                {
                    NombreSeccion = Request.QueryString["SECCION" + j].ToString();
                    RetrievedSecciones.Add(Request.QueryString["SECCION" + j].ToString());

                    while (Request.QueryString["ELEMENTO" + j + "" + i] != null)
                    {
                        ListaElementos.Add(Request.QueryString["ELEMENTO" + j + "" + i].ToString());
                        i++;
                    }
                    List<String> contenidos = new List<String>();
                    contenidos = RecibeContenido(nompr);
                    LlenaAcordionPane(nompr, NombreSeccion, ListaElementos, contenidos);
                }

                j++;
            }
        }

        /// <summary>
        /// Trae las secciones fijadas por el usuario
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <returns>Retorna las secciones en una lista de String</returns>
        protected List<String> RecibirSecciones(String NombreProyecto)
        {
            return sqlers.SelectSeccionesFijadas(NombreProyecto);
        }

        /// <summary>
        /// Trae los elementos fijados por el usuario
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        /// <returns>Retorna los elementos en una lista de String</returns>
        protected List<String> RecibirElementosFijados(String NombreProyecto, String NombreSeccion)
        {
            return sqlers.SelectElementosComponentesErs(NombreProyecto, NombreSeccion);
        }

        /// <summary>
        /// Invoca a una funcion que tra los elementos, el componente grafico y el tipo de dato
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        /// <param name="NombreElemento">Contiene el nombre del elemento</param>
        /// <returns>Retorna un String con el valor del componenete, el elemento y el tipo de dato concatenados</returns>
        protected String RecibirElementoCompTipoDat(String NombreProyecto, String NombreSeccion, String NombreElemento)
        {
            return sqlers.SelectElementosComponentesErs2(NombreProyecto, NombreSeccion, NombreElemento);
        }

        /// <summary>
        /// Recore los accordionpanes contenidos en el acordionCtrl y dentro de los panes
        /// recorre los TextBox, guardando los elementos con texto e invoca los procedimientos
        /// para insertar las filas necesarias para al final introducir el contenido
        /// de los elementos en las secciones fijadas anteriormente
        /// </summary>
        protected void RecoleccionRespuesta()
        {
            IdErs = SelectIrErs(NombreProyecto);
            String NombreSeccion = null;
            String NombreElemento = null;
            Boolean HayPPS = true;
            Boolean HayPPE = true;
            List<String> contenidos = new List<String>();
            contenidos = RecibeContenido(NombreProyecto);
            for (int i = 0; i < AccordionCtrl.Panes.Count; i++)
            {
                Object acc = new AccordionPane();
                acc = AccordionCtrl.Panes[i];
                if (acc is AccordionPane)
                {
                    AccordionPane acordion = acc as AccordionPane;
                    NombreSeccion = acordion.HeaderContainer.ID;
                }
                Boolean primero = true;
                HayPPS = true;
                for (int j = 0; j < AccordionCtrl.Panes[i].ContentContainer.Controls.Count; j++)
                {
                    Object ctr = new Control();
                    ctr = AccordionCtrl.Panes[i].ContentContainer.Controls[j];
                    HayPPE = true;
                    if (ctr is TextBox)
                    {
                        TextBox texto = ctr as TextBox;
                        NombreContenidos.Add(texto.Text);
                        if (primero)
                        {
                            for (int l = 0; l < contenidos.Count; l++)
                            {
                                String[] aux = contenidos[l].Split('@');
                                if (aux[2].Equals(NombreSeccion))
                                    HayPPS = false;
                            }
                            if (HayPPS)
                            {
                                AgregaPlanProySecc(NombreProyecto, NombreSeccion);
                            }
                            primero = false;
                        }
                        for (int g = 0; g < contenidos.Count; g++)
                        {
                            String[] aux2 = contenidos[g].Split('@');
                            if (aux2[1].Equals(NombreElemento))
                                HayPPE = false;
                        }
                        if (HayPPE)
                        {
                            AgregaPlanProyElem(NombreProyecto, NombreSeccion, NombreElemento);
                            AgregaContenido(NombreElemento, texto.Text.ToString(), NombreProyecto, IdErs);
                        }
                        else
                        {
                            ActualizaCont(NombreProyecto, NombreSeccion, NombreElemento, texto.Text.ToString());
                        }

                    }
                    if (ctr is LiteralControl)
                    {
                        LiteralControl lc = ctr as LiteralControl;
                        NombreElemento = lc.Text;
                    }

                }
            }
        }

        /// <summary>
        /// Invoca a una funcion que trae el id del ERS 
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <returns>Retorna un entero con el valor del id</returns>
        protected int SelectIrErs(String NombreProyecto)
        {
            return sqlers.SelectIdErsExistente(NombreProyecto);
        }

        /// <summary>
        /// Invoca a una funcion que recibe los valores para actualizar
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        /// <param name="NombreElemento">Contiene el nombre del elemento</param>
        /// <param name="contenido">Almacena el contenido a actualizar</param>
        protected void ActualizaCont(String NombreProyecto, String NombreSeccion, String NombreElemento, String contenido)
        {
            sqlers.ActualizaCont(NombreProyecto, NombreSeccion, NombreElemento, contenido);
        }

        /// <summary>
        /// Invoca a un procedimiento que agrega el contenido para el documento
        /// </summary>
        /// <param name="NombreElemento">Contiene el nombre del elemento</param>
        /// <param name="Contenido">Almacena el texto a guardar</param>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="Id">Contiene el Id del ERS</param>
        protected void AgregaContenido(String NombreElemento, String Contenido, String NombreProyecto, int Id)
        {
            sqlers.AgregaContenidoElemento(NombreElemento, Contenido, NombreProyecto, Id);
        }

        /// <summary>
        /// Invoca a un procedimiento que agrega los insert que relacionan
        /// la plantilla con el proyecto y la seccion
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        protected void AgregaPlanProySecc(String NombreProyecto, String NombreSeccion)
        {
            sqlers.AgregaPlanProySecc(NombreProyecto, NombreSeccion);
        }

        /// <summary>
        /// Invoca a un procedimiento que agrega los insert que relacionan
        /// la plantilla con el proyecto y el elemento
        /// </summary>
        /// <param name="NombreProyecto">Contiene el nombre del proyecto</param>
        /// <param name="NombreSeccion">Contiene el nombre de la seccion</param>
        /// <param name="NombreElemento">Contiene el nombre del elemento</param>
        protected void AgregaPlanProyElem(String NombreProyecto, String NombreSeccion, String NombreElemento)
        {
            sqlers.AgregaPlanProyElem(NombreProyecto, NombreSeccion, NombreElemento);
        }

        protected void BotonCancelar_Click2(object sender, EventArgs e)
        {
            Response.Redirect("../../index.aspx");
        }

        protected void BotonGuardar_Click(object sender, EventArgs e)
        {
            RecoleccionRespuesta();
            Response.Redirect(postdata);
            // ShowAlertMessage("Los cambios fueron guardados con éxito!");

        }

        protected void BotonGenerarErs_Click(object sender, EventArgs e)
        {
            GeneraPDF.GenerarPdfErs(NombreProyecto);
            //Response.Redirect(postdata);
        }

        //metodo para mostrar ventanas de alerta
        public static void ShowAlertMessage2(string error)
        {

            Page page = HttpContext.Current.Handler as Page;
            if (page != null)
            {
                error = error.Replace("'", "\'");
                ScriptManager.RegisterStartupScript(page, page.GetType(), "err_msg", "alert('" + error + "');window.location='../../index.aspx';", true);
            }
        }


    }
}